[アップデート] AWS CDK でリプレースメントタイプの更新が含まれている場合に自動的に `--no-rollback` フラグを無効にするか、ユーザーに確認を求める機能が追加されました

[アップデート] AWS CDK でリプレースメントタイプの更新が含まれている場合に自動的に `--no-rollback` フラグを無効にするか、ユーザーに確認を求める機能が追加されました

Clock Icon2024.11.19

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最近のリリースである v2.166.0 で、下記の CLI の機能アップデートが追加されていました。

cli: automatically roll back stacks if necessary (#31920) (2f9fb1e), closes #30546

AWS CDK では、リプレースメントタイプの更新が含まれる変更をデプロイする際に、--no-rollback フラグが有効になっているとデプロイメントが失敗します。これはデプロイメントが失敗した際にスタックの状態を元に戻さない(ロールバックしない)状態となった場合に、リソースの削除と再作成が適切に処理されないことがあり、それを防ぐための CloudFormation の制約となります。

今回のアップデートでは、リプレースメントタイプの更新が含まれている場合に自動的に --no-rollback フラグを無効にするか、ユーザーに確認を求める機能が追加されました。

試してみた

CDK パッケージのアップデート

AWS CDK モジュールを v2.166.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

リプレイスメントタイプの変更をデプロイしてみる

次のようにデプロイ済みのリソースの名前が変わるような変更を加えます。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    new dynamodb.Table(this, 'Table', {
      tableName: 'FirstTableName', // テーブル名を変更
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
    });
  }
}

上記の CDK 実装では、DynamoDB テーブルのテーブル名を変更しているため、リプレイスメントタイプの変更が発生します。

$ cdk diff
start: Building f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
success: Built f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
start: Publishing f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
success: Published f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main
Resources
[~] AWS::DynamoDB::Table Table TableCD117FA1 replace
 └─ [+] TableName (requires replacement)
     └─ FirstTableName

start: Building 728089eee60c4e555de9867a5be2ba2f40a7dceb12a4d1ec64e59e5f4f647b5c:current_account-current_region
success: Built 728089eee60c4e555de9867a5be2ba2f40a7dceb12a4d1ec64e59e5f4f647b5c:current_account-current_region
start: Publishing 728089eee60c4e555de9867a5be2ba2f40a7dceb12a4d1ec64e59e5f4f647b5c:current_account-current_region
success: Published 728089eee60c4e555de9867a5be2ba2f40a7dceb12a4d1ec64e59e5f4f647b5c:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main2
Resources
[-] AWS::Cognito::UserPool UserPool UserPool6BA7E5F2 destroy
[-] AWS::Cognito::UserPoolDomain UserPool/UserPoolDomain UserPoolUserPoolDomain9F01E991 destroy
[-] AWS::Cognito::UserPoolClient UserPool/UserPoolClient UserPoolUserPoolClient40176907 destroy
[-] AWS::Cognito::UserPoolUser UserPoolUser UserPoolUser destroy

✨  Number of stacks with differences: 2

--no-rollback フラグを付けてデプロイを試みると、次のようにリプレイスメントタイプの変更が含まれる変更が含まれているため通常のデプロイメントが必要である旨のメッセージが表示されます。n でキャンセルするとコマンド実行が abort されてデプロイは行われずに終了します。

$ npx cdk deploy Main --no-rollback

✨  Synthesis time: 4.47s

Main: start: Building f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
Main: success: Built f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
Main: start: Publishing f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
Main: success: Published f5e660ff36bceb578e320bf52b6e65cace83788d7c4189fba33ad76176b6849b:XXXXXXXXXXXX-ap-northeast-1
Main: deploying... [1/1]
Main: creating CloudFormation changeset...
Change includes a replacement which cannot be deployed with "--no-rollback". Perform a regular deployment (y/n)?

y でデプロイを続行すると、そのままデプロイが行われました。

$ npx cdk deploy Main --no-rollback

✨  Synthesis time: 5.73s

Main: deploying... [1/1]
Main: creating CloudFormation changeset...
Change includes a replacement which cannot be deployed with "--no-rollback". Perform a regular deployment (y/n)? y
Main: creating CloudFormation changeset...

 ✅  Main

✨  Deployment time: 45.69s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/Main/0a88e180-9e80-11ef-9bbe-0eac52eae901

✨  Total time: 51.42s

以前までの挙動

CDK バージョンを v2.165.0 にダウングレードして、以前までの挙動を確認してみます。

リプレイスメントタイプの変更を含む --no-rollback フラグを付けたデプロイを試みると、次のように CloudFormation のエラーでデプロイが失敗しました。

$ npx cdk deploy Main --no-rollback

✨  Synthesis time: 6.98s

Main: start: Building 3a8ac364e0bb540ecec545790c0e0682b8498f596507306dda04b715b3660f53:XXXXXXXXXXXX-ap-northeast-1
Main: success: Built 3a8ac364e0bb540ecec545790c0e0682b8498f596507306dda04b715b3660f53:XXXXXXXXXXXX-ap-northeast-1
Main: start: Publishing 3a8ac364e0bb540ecec545790c0e0682b8498f596507306dda04b715b3660f53:XXXXXXXXXXXX-ap-northeast-1
Main: success: Published 3a8ac364e0bb540ecec545790c0e0682b8498f596507306dda04b715b3660f53:XXXXXXXXXXXX-ap-northeast-1
Stack undefined
Main: deploying... [1/1]
Main: creating CloudFormation changeset...
8:02:12 PM | UPDATE_FAILED        | AWS::DynamoDB::Table | TableCD117FA1
Replacement type updates not supported on stack with disable-rollback.

❌  Main failed: The stack named Main failed to deploy: UPDATE_FAILED (The following resource(s) failed to update: [TableCD117FA1]. ): Replacement type updates not supported on stack with disable-rollback.

おわりに

AWS CDK のアップデートでリプレースメントタイプの更新が含まれている場合に自動的に --no-rollback フラグを無効にするか、ユーザーに確認を求める機能が追加されたのでご紹介しました。

CloudFormation レベルでエラーになる前に、CDK CLI の実行時点でエラーを検知できるようになったので、より早いフィードバックを得られるようになったのは嬉しいですね。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.